<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
include "coneccionbdd.php";

class producto {

    public static $datat = array();
    public static $datarep = array();

    public static function getTipoRolesUser($user_name) {
        $query = "SELECT r.rol_descripcion,u.id,u.usuario_nombre FROM usuarios_roles t
        inner join usuarios u on t.id_usuario
        inner join roles r on t.id_rol
        where u.usuario_nombre='$user_name' group by r.rol_descripcion";
        $resultado = mysqli_query(conexion::getConectar(), $query);
        $array_roles = array();
        while ($fila = mysqli_fetch_array($resultado)) {
            array_push($array_roles, $fila);
        }
        return $array_roles;
    }

    public static function getInfoUserSesion($datos) {
        $result = array();
        $username = $datos["usuario_nombre"];
        $password = $datos["password"];
        $query = "SELECT * FROM usuarios WHERE usuario_nombre='" . $username . "' AND password='" . $password . "'";
        $resultado = mysqli_query(coneccionbdd::getConectar(), $query);
        $numrows = mysqli_num_rows($resultado);
        if ($numrows != 0) {
            while ($fila = mysqli_fetch_array($resultado)) {
                $dbusername = $fila['usuario_nombre'];
                $dbpassword = $fila['password'];
            }
            mysqli_free_result($resultado);
            mysqli_close(coneccionbdd::getConectar());
            if ($username == $dbusername && $password == $dbpassword) {
                $result['existe_datos'] = true;
                $result['username'] = $username;
            }
        } else {
            $result['existe_datos'] = false;
            $message = "Nombre de usuario ó contraseña invalida!";
            $result['message'] = $message;
        }
        return $result;
    }

    public static function getCamposObligatoriosInicioSesion() {
        return array(
            'usuario_nombre' => 'usuario_nombre',
            'password' => 'password',
        );
    }

    public static function getMensajesInicioSesion() {
        return array(
            'usuario_nombre' => array('Ingrese Usuario.'),
            'password' => array('Ingrese Password.'),
        );
    }

    // VALIDAR CAMPOS

    public static function getCamposObligatorios() {

        return array(
            'codigo' => 'codigo',
            'nombre' => 'nombre',
            'precio_compra' => 'precio_compra',
            'precio_venta' => 'precio_venta',
            'id_proveedor' => 'id_proveedor',
            'iva' => 'iva',
            'tipo_medida' => 'tipo_medida',
            'descuento' => 'descuento',
        );
    }

    public static function getError($data, $msj_tipo) {
        $camposobligatorios = $msj_tipo ? static:: getCamposObligatorios() : static::getCamposObligatoriosInicioSesion();
        $mensajes_campos = $msj_tipo ? static::getMensajes() : static::getMensajesInicioSesion();
        $arrayerrors = array();
        $guardar = true;
        foreach ($data as $key => $value) {
            $existe_campo = array_key_exists($key, $camposobligatorios);
            if ($existe_campo) {
                $hay_dato = ($value == null || $value == "") ? false : true; //Verifica que el campono este nullo ni vacio
                if (!$hay_dato) {
                    $guardar = false;
                    $arrayerrors[$key] = $mensajes_campos[$key];
                }
            }
        }
        $resultado = array('guardar' => $guardar, 'errores' => $arrayerrors);
        return $resultado;
    }

    public static function getMsjCamposObligatorios($data, $msj_tipo) {
        $camposobligatorios = static::getError($data, $msj_tipo);
        return array(
            'success' => $camposobligatorios["guardar"],
            'errors' => $camposobligatorios["errores"]
        );
    }

    public static function getMensajes() {
        return array(
            'codigo' => array('El codigo de producto es Obligatorio.'),
            'nombre' => array('El nombre de producto es Obligatorio.'),
            'precio_compra' => array('El precio de compra es obligatorio.'),
            'precio_venta' => array('El precio de venta es obligatorios'),
            'id_proveedor' => array('El proveedor es obligatorio.'),
            'iva' => array('El iva es obligatorio.'),
            'tipo_medida' => array('El tipo de medida es obligatorio.'),
            'descuento' => array('El descuento es obligatorio.'),
        );
    }

    // INSERTAR, ACTUALIZAR Y ELIMINAR

    public static function setInsertar($datos) {
        /**
         * Posiciones son las miismos campos q tiene en la bdd
         * datos["xnombrecampo"]
         */
        $codigo = $datos["codigo"];
        $nombre = $datos["nombre"];
        $precio_compra = floatval($datos["precio_compra"]);
        $precio_venta = floatval($datos["precio_venta"]);
        $id_proveedor = intval($datos["id_proveedor"]);
        $estado = 1;
        $iva = intval($datos["iva"]);
        $tipo_medida = $datos["tipo_medida"];
        $descuento = intval($datos["descuento"]);
        $query = "INSERT INTO producto (codigo,nombre,precio_compra,precio_venta,id_proveedor,estado,iva,tipo_medida,descuento ) "
                . "VALUES (?,?,?,?,?,?,?,?,?)";
        $conexion = new coneccionbdd();
        //Estos tipos representa los tipos de valores q acepta en la bdd de aqlla tabla
        //Character	Description
//i	corresponding variable has type integer
//d	corresponding variable has type double
//s	corresponding variable has type string
//b	corresponding variable is a blob and will be sent in packets
        $types = "ssddiiisi"; //d acuerdo al numero de parametros a insertar son la dimension de tipos
        //            mysqli_stmt_bind_param($stmt, "ssddiiisi", $params[0], $params[1], $params[2], $params[3], $params[4], $params[5], $params[6], $params[7], $params[8]);
        $array_params = array($codigo, $nombre, $precio_compra, $precio_venta, $id_proveedor, $estado, $iva, $tipo_medida, $descuento);
        $result = $conexion->setInsertDataCliente($query, $array_params, $types);
        return $result;
    }

    public static function setActualizar($datos) {
        $id = $datos["id"];
        $codigo = $datos["codigo"];
        $detalle = $datos["detalle"];
        $precio_compra = $datos["precio_compra"];
        $iva = $datos["iva"];
        $precio_venta = $datos["precio_venta"];
        $id_proveedor = $datos["id_proveedor"];
        $estado = 1;

        $sql = "UPDATE producto SET codigo='$codigo', detalle='$detalle',"
                . " precio_compra='$precio_compra', precio_venta='$precio_venta',"
                . " id_proveedor='$id_proveedor', estado='$estado' "
                . "WHERE id='$id'";

        $resultado = mysqli_query(coneccionbdd::getConectar(), $sql);
        mysqli_close(coneccionbdd::getConectar()); // Cerramos la conexion con la base de datos
        return $resultado;
    }

    public static function setEliminar($datos) {
        $id = $datos["id"];
        $sql = "DELETE from producto WHERE id='$id";

        $resultado = mysqli_query(coneccionbdd::getConectar(), $sql);
        mysqli_close(coneccionbdd::getConectar()); // Cerramos la conexion con la base de datos
        return $resultado;
    }

    public static function getListSelect2($search_value = null) {
        $array_result = array();
        $conexion = new coneccionbdd();
        $q = '';        //    create variable for input
        $q .= " SELECT ";
        $q .= " t.id,t.nombre as text, t.codigo as text";
        $q .= " FROM ";
        $q .= " producto t ";
        $q .= " WHERE ";
        $q .= " t.codigo like ? ";
        $q .= " OR ";
        $q .= " t.nombre like ? ";
        $q .= "limit 10 ";
//        $array_result = $search_value ? $conexion->ObtenerResultadoSelectLikeCliente($q, $search_value) : static::getInfoClientesData();
        $array_result = $search_value ? $conexion->ObtenerResultado('Call pa_detalle_producto("' . $search_value . '")') : $conexion->ObtenerResultado("Select t.id, t.codigo, t.nombre as text from producto t limit 10");
        return $array_result;
    }

    //OBTENER DATOS PARA EL GRID DE PRODUCTOS EXISTENTES

    public static function getProductosTotal($usuario_id = null) {
        $query = "SELECT  t.codigo,t.nombre,t.precio_venta, provee.nombre as id_proveedor FROM producto t"
                . " inner join proveedor provee on t.id_proveedor =provee.id";

        if ($usuario_id) {
            $query .=" where t.id=$usuario_id";
        }
        $resultado = mysqli_query(coneccionbdd::getConectar(), $query);
        $array_consulta = array();
        $count = 0;
        while ($fila = mysqli_fetch_array($resultado)) {
            array_push($array_consulta, $fila);
            $count++;
        }
        $array_resultado = array('total' => $count, 'result' => $array_consulta);
        return $array_resultado;
    }

    public static function getProductosTotalRango($limit, $offset, $usuario_id) {
        $query = "SELECT  t.codigo,t.nombre,t.precio_venta,t.iva,t.tipo_medida,t.descuento, provee.nombre as id_proveedor "
                . " FROM producto t "
                . " inner join proveedor provee on t.id_proveedor =provee.id";
        if ($usuario_id) {
            $query.=" where t.id =$usuario_id";
        }
        $query.= "  limit $offset ,$limit";
        $conexion = new coneccionbdd();
        $array_consulta = $conexion->ObtenerResultado($query);
        $count = count($array_consulta);
        $array_resultado = array('total' => $count, 'result' => $array_consulta);
        return $array_resultado;
    }

    public static function getProductos($data) {
//Informacion Total
        $usuario_id = $data['Productos_id_producto'] && $data['Productos_id_producto'] != "" ? $data['Productos_id_producto'] : null;

        $totalInformacion = static::getProductosTotal($usuario_id);
        $command_total = $totalInformacion['total'];
//total
        $result['total'] = (int) $command_total;
        $current_page = isset($data['current']) ? (int) $data['current'] : 0; // control a error when 'current' not exist
        $limit = isset($data['rowCount']) ? $data['rowCount'] : 10;
        $offset = ($limit * ($current_page - 1));
        $result['current'] = $current_page;
        $result['rowCount'] = $limit;
        $resultadoPaginacion = static::getProductosTotalRango($limit, $offset, $usuario_id);
        $result['rows'] = $result['total'] != 0 ? $resultadoPaginacion['result'] : array();
        return $result;
    }

    // OBTENER DATOS DE PRODUCTOS AGOTADOS

    public static function getProductosTotalAgotados() {
        $query = '';        //    create variable for input
        $query .= " SELECT ";
        $query .= " t.codigo,t.nombre,pst.cantidad_minima,pst.cantidad_disponible ,prov.nombre as proveedor";
        $query .= " FROM ";
        $query .= " producto t";
        $query .= " inner join producto_stock pst on t.id=pst.id_producto";
        $query .= " inner join proveedor prov on t.id_proveedor=prov.id";
        $query .= " where";
        $query .= " pst.cantidad_disponible=0";

//SELECT  t.codigo,t.detalle,pst.cantidad_minima,pst.cantidad_disponible ,prov.nombre as proveedor FROM inventario.producto t
//inner join producto_stock pst on t.id=pst.id_producto
//inner join proveedor prov on t.id_proveedor=prov.id
//where pst.cantidad_disponible=0
//;
        $array_result = array();
        $conexion = new coneccionbdd();
        $array_consulta = array();
        $array_consulta = $conexion->ObtenerResultado($query);
        $count = count($array_consulta);
        $array_resultado = array('total' => $count, 'result' => $array_consulta);
        return $array_resultado;
    }

    public static function getProductosTotalRangoAgotados($limit, $offset) {
        $query = '';        //    create variable for input
        $query .= " SELECT ";
        $query .= " t.codigo,t.nombre,pst.cantidad_minima,pst.cantidad_disponible ,prov.nombre as proveedor";
        $query .= " FROM ";
        $query .= " producto t";
        $query .= " inner join producto_stock pst on t.id=pst.id_producto";
        $query .= " inner join proveedor prov on t.id_proveedor=prov.id";
        $query .= " where";
        $query .= " pst.cantidad_disponible=0";
        $query .= " limit $offset ,$limit";
        $conexion = new coneccionbdd();
        $array_consulta = array();
        $array_consulta = $conexion->ObtenerResultado($query);
        $count = count($array_consulta);
        $array_resultado = array('total' => $count, 'result' => $array_consulta);
        return $array_resultado;
    }

    /**
     * Reporte Productos Agotados DATA para formar el grid
     */
    public static function getProductosAgotados($data) {
//Informacion Total
        $totalInformacion = static::getProductosTotalAgotados();
        $command_total = $totalInformacion['total'];
//total
        $result['total'] = (int) $command_total;
        $current_page = isset($data['current']) ? (int) $data['current'] : 0; // control a error when 'current' not exist
        $limit = isset($data['rowCount']) ? $data['rowCount'] : 10;
        $offset = ($limit * ($current_page - 1));
        $result['current'] = $current_page;
        $result['rowCount'] = $limit;
        $resultadoPaginacion = static::getProductosTotalRangoAgotados($limit, $offset);
        $result['rows'] = $result['total'] != 0 ? $resultadoPaginacion['result'] : array();
        return $result;
    }

    // REPORTES

    public static function generateRankingReporteProductosColumnVentas($fecha_inicio = null, $fecha_fin = null, $formatGroup, $producto_id = null) {
        $report = array();
        self::$datarep = array();
        $fechaInicio = new DateTime($fecha_inicio);

        $fechaFin = new DateTime($fecha_fin);
        $interval = Util::formartModify($formatGroup);
        $fechaFin->modify('+1 day');
//intervalo de aumento de fechas
        $intervalDate = DateInterval::createFromDateString($interval);
//establecre pedriodo entre fechas
        $periodDate = new DatePeriod($fechaInicio, $intervalDate, $fechaFin);

        $conexion = new coneccionbdd();
//        var_dump($fecha_inicio,$fecha_fin,$producto_id,$formatGroup);
//        die();
        $datareportes = $producto_id ? $conexion->ObtenerResultado("Call paRankingReporteProductosColumnVentasProducto('$fecha_inicio','$fecha_fin','$formatGroup','$producto_id')") : $conexion->ObtenerResultado("Call paRankingReporteProductosColumnVentas('$fecha_inicio','$fecha_fin','$formatGroup')");
        $data_names = util::array_column($datareportes, 'name');
        $data_names = array_unique($data_names);
        $dataProducto = array();
        $cont = 0;
        foreach ($data_names as $value) {
            array_push($dataProducto, array('name' => $value));
            $cont++;
            if ($cont == 10) {
                break;
            }
        }
        self::$datarep = $dataProducto;
        foreach ($report as $key => $value) {
            self::$datarep[$key]["data"] = array();
        }

        foreach ($periodDate as $date) {
            self::$datat = array();
            $date = $date->format(str_replace("%", "", $formatGroup));
            $report["xAxis"]["categories"][] = $date;
            static::recursive_array_search_money($date, $datareportes);
            $dataEsatdosReporte = util::array_column(self::$datat, "name");
            $estadosFalta = array_diff(util::array_column($dataProducto, 'name'), $dataEsatdosReporte);

            if ($estadosFalta) {
                foreach ($estadosFalta as $value) {
                    self::$datat[] = array("name" => $value, 'data' => (float) 0);
                }
            }

            foreach (self::$datarep as $key => $value) {
                foreach (self::$datat as $valuet) {
                    if ($value["name"] == $valuet["name"]) {
                        self::$datarep[$key]['data'][] = $valuet["data"];
                        break;
                    }
                }
            }
        }

        $report["chart"]["type"] = "column";
        $report["subtitle"]["text"] = "Reporte de Productos Segun su fecha";
        $report['title']['text'] = '';
        $report["chart"]["marginTop"] = "35";
//          subtitle: {
//            text: 'Source: WorldClimate.com'
//        },
        $report['tooltip']['shared'] = true;
        $report['tooltip']['pointFormat'] = '<span style="color:{series.color};">●</span> {series.name}: <b>${point.y:.2f}</b><br>';
        $report['yAxis']['title']['text'] = "Dólares $";
        $report['xAxis']['labels'] = array("rotation" => -45);
        $report['credits']['enabled'] = false;
        $report['yAxis']['allowDecimals'] = true;
        $report["series"] = self::$datarep;
        $report["mostrar"] = !empty($datareportes) ? true : false;
        return $report;
    }

    public static function generateRankingReporteProductosColumnVentasUsuarios($fecha_inicio = null, $fecha_fin = null, $formatGroup, $usuario_nombre = null, $producto_id = null) {
        $report = array();
        self::$datarep = array();
        $fechaInicio = new DateTime($fecha_inicio);

        $fechaFin = new DateTime($fecha_fin);
        $interval = Util::formartModify($formatGroup);
        $fechaFin->modify('+1 day');
//intervalo de aumento de fechas
        $intervalDate = DateInterval::createFromDateString($interval);
//establecre pedriodo entre fechas
        $periodDate = new DatePeriod($fechaInicio, $intervalDate, $fechaFin);

        $conexion = new coneccionbdd();
//        die();
        $datareportes = $producto_id ? $conexion->ObtenerResultado("Call paVentasUsuariosProducto('$fecha_inicio','$fecha_fin','$formatGroup','$usuario_nombre','$producto_id')") : $conexion->ObtenerResultado("Call paVentasUsuarios('$fecha_inicio','$fecha_fin','$formatGroup','$usuario_nombre')");
        $data_names = util::array_column($datareportes, 'name');
        $data_names = array_unique($data_names);
        $dataProducto = array();
        $cont = 0;
        foreach ($data_names as $value) {
            array_push($dataProducto, array('name' => $value));
            $cont++;
            if ($cont == 10) {
                break;
            }
        }
        self::$datarep = $dataProducto;
        foreach ($report as $key => $value) {
            self::$datarep[$key]["data"] = array();
        }

        foreach ($periodDate as $date) {
            self::$datat = array();
            $date = $date->format(str_replace("%", "", $formatGroup));
            $report["xAxis"]["categories"][] = $date;
            static::recursive_array_search_money($date, $datareportes);
            $dataEsatdosReporte = util::array_column(self::$datat, "name");
            $estadosFalta = array_diff(util::array_column($dataProducto, 'name'), $dataEsatdosReporte);

            if ($estadosFalta) {
                foreach ($estadosFalta as $value) {
                    self::$datat[] = array("name" => $value, 'data' => (float) 0);
                }
            }

            foreach (self::$datarep as $key => $value) {
                foreach (self::$datat as $valuet) {
                    if ($value["name"] == $valuet["name"]) {
                        self::$datarep[$key]['data'][] = $valuet["data"];
                        break;
                    }
                }
            }
        }

        $report["chart"]["type"] = "column";
        $report['title']['text'] = '';
        $report["chart"]["marginTop"] = "35";
        $report['tooltip']['shared'] = true;
        $report['tooltip']['pointFormat'] = '<span style="color:{series.color};">●</span> {series.name}: <b>${point.y:.2f}</b><br>';
        $report['yAxis']['title']['text'] = "Dólares $";
        $report['xAxis']['labels'] = array("rotation" => -45);
        $report['credits']['enabled'] = false;
        $report['yAxis']['allowDecimals'] = true;
        $report["series"] = self::$datarep;
        $report["mostrar"] = !empty($datareportes) ? true : false;
        return $report;
    }

    public static function recursive_array_search_money($needle, $haystack) {
        foreach ($haystack as $value) {
            if ($needle === $value OR ( is_array($value) && static::recursive_array_search_money($needle, $value))) {
                self::$datat[] = array("name" => $haystack["name"], "data" => (float) $haystack["total"]);
            }
        }
    }

}
